import { ResponseCode } from './response-code.enum';

/**
 * 统一响应结果接口
 */
export interface ApiResponse<T = any> {
  /** 响应状态码 */
  code: string;
  /** 响应消息 */
  message: string;
  /** 响应数据 */
  data?: T;
  /** 时间戳 */
  timestamp: number;
  /** 请求路径 */
  path?: string;
}

/**
 * 成功响应结果
 */
export interface SuccessResponse<T = any> extends Omit<ApiResponse<T>, 'code' | 'message'> {
  code: ResponseCode.SUCCESS;
  message: string;
  data: T;
}

/**
 * 错误响应结果
 */
export interface ErrorResponse extends Omit<ApiResponse<never>, 'data'> {
  code: Exclude<ResponseCode, ResponseCode.SUCCESS>;
  message: string;
  data?: never;
}

/**
 * 分页响应结果
 */
export interface PaginatedResponse<T = any> extends SuccessResponse<{
  list: T[];
  total: number;
  page: number;
  pageSize: number;
  totalPages: number;
}> {}

/**
 * 列表响应结果
 */
export interface ListResponse<T = any> extends SuccessResponse<T[]> {}

/**
 * 创建成功响应
 * @param data 响应数据
 * @param message 响应消息
 * @returns 成功响应对象
 */
export function createSuccessResponse<T>(
  data: T,
  message: string = '操作成功'
): SuccessResponse<T> {
  return {
    code: ResponseCode.SUCCESS,
    message,
    data,
    timestamp: Date.now(),
  };
}

/**
 * 创建错误响应
 * @param code 错误状态码
 * @param message 错误消息
 * @param path 请求路径
 * @returns 错误响应对象
 */
export function createErrorResponse(
  code: ResponseCode,
  message?: string,
  path?: string
): ErrorResponse {
  return {
    code: code as Exclude<ResponseCode, ResponseCode.SUCCESS>,
    message: message || '操作失败',
    timestamp: Date.now(),
    path,
  };
}

/**
 * 创建分页响应
 * @param list 数据列表
 * @param total 总数量
 * @param page 当前页码
 * @param pageSize 每页大小
 * @param message 响应消息
 * @returns 分页响应对象
 */
export function createPaginatedResponse<T>(
  list: T[],
  total: number,
  page: number,
  pageSize: number,
  message: string = '查询成功'
): PaginatedResponse<T> {
  const totalPages = Math.ceil(total / pageSize);
  
  return {
    code: ResponseCode.SUCCESS,
    message,
    data: {
      list,
      total,
      page,
      pageSize,
      totalPages,
    },
    timestamp: Date.now(),
  };
}

/**
 * 创建列表响应
 * @param list 数据列表
 * @param message 响应消息
 * @returns 列表响应对象
 */
export function createListResponse<T>(
  list: T[],
  message: string = '查询成功'
): ListResponse<T> {
  return {
    code: ResponseCode.SUCCESS,
    message,
    data: list,
    timestamp: Date.now(),
  };
}
